#include <iostream> // 标准输入输出流
#include <cstring> // 提供字符串处理函数
#include <sys/socket.h> // 提供socket相关函数
#include <netinet/in.h> // 提供网络字节序转换和IP地址结构
#include <unistd.h> // 提供POSIX操作系统API，如read, write等
#include <thread> // 提供线程支持

#define PORT 1207 // 定义服务器监听的端口号

// 处理客户端连接的函数
void handle_client(int client_sock) {
    char buffer[1024] = {0}; // 定义一个缓冲区用于存储接收的数据
    while (true) { // 无限循环，持续接收客户端消息
        int read_size = read(client_sock, buffer, sizeof(buffer) - 1); // 从socket读取数据
        if (read_size <= 0) break; // 如果读取失败或连接关闭，则退出循环

        buffer[read_size] = '\0'; // 确保字符串以null字符结尾
        std::cout << "Client: " << buffer << std::endl; // 输出客户端消息

        // 将接收到的消息发送回客户端
        send(client_sock, buffer, strlen(buffer), 0);
    }
    close(client_sock); // 关闭客户端连接的socket
}

int main() {
    int server_sock = socket(AF_INET, SOCK_STREAM, 0); // 创建TCP socket
    struct sockaddr_in address; // 定义一个 sockaddr_in 结构用于存储服务器地址信息
    address.sin_family = AF_INET; // 设置地址族为IPv4
    address.sin_addr.s_addr = INADDR_ANY; // 服务器监听所有可用接口
    address.sin_port = htons(PORT); // 设置服务器监听端口，并转换为网络字节序

    if (bind(server_sock, (struct sockaddr*)&address, sizeof(address)) < 0) { // 绑定socket到地址
        std::cerr << "Bind failed" << std::endl;
        return 1;
    }
    if (listen(server_sock, 10) < 0) { // 开始监听，参数10表示最大挂起连接数
        std::cerr << "Listen failed" << std::endl;
        return 1;
    }

    while (true) { // 无限循环，持续接受客户端连接
        int client_sock = accept(server_sock, nullptr, nullptr); // 接受客户端连接
        if (client_sock < 0) {
            std::cerr << "Accept failed" << std::endl;
            continue; // 如果接受失败，继续循环
        }

        std::thread client_thread(handle_client, client_sock); // 为每个客户端创建新线程
        client_thread.detach(); // 分离线程，允许其独立运行
    }

    close(server_sock); // 关闭服务器socket
    return 0;
}
